拡張Kコンパイラ V3.6 ――――――――――――――――――――――――――――――――――――――― FM−7/11活用研究 掲載 FM−7 拡張KコンパイラV3.6 Kコンパイラ マシン語   ”K”  $2000−$41FF S=$2000 マシン語   ”RT” $4D00−$4FFF ファイル版Kコンパイラ BASIC ”MAIN” マシン語  ”RTF” $4D00−$4FFF マシン語  ”KF”  $2000−$41FF S=$2000 リロケータ ソース   ”RELS” オブジェクト      ”REL”  $5000−$5088 $5000 エグゼキューター ソース”EXES” オブジェクト      ”EXE”  $5000−$5045 $5000 [fix]はKコンパイラのランタイムルーチン 4D09:20→39の修正(PiO’85 12月号より) ファイル版Kコンパイラは元々修正(変更)済み ――――――――――――――――――――――――――――――――――――――― 拡張Kコンパイラ V3.6 リカーシブルのできるコンパイラ K言語は、パソコン用コンパイラ言語として考案されたもので、 その文法は比較的BASICに近く、 機能を縮小してコンパイラ自体を小さくできるように配慮されています。 拡張Kコンパイラは、そのK言語にいくつかのコマンドを加え、 さらに6809CPUの特徴を生かすべく設計されたコンパイラで、 次のような特徴があります。 (1)引数を使ったサブルーチン・コールや、   リカシーブル・コールができ、   サブルーチンヘの引数は値渡しで行なえる。 (2)行番号の概念はなく、英数字のラベルが使える。 (3)IF−THEN−ELSEの複数行化ができ、REPEAT−UNTIL も使える。 (4)REPEAT、WHILE のループ中への飛び込み、飛び出しができる。 (5)マシン語プログラムをプログラム中に書ける。 (6)コンパイラ自体とコンパイル後のオブジェクト(マシン語プログラム)は、   ポジションインデペンデント(位置自由)である。 (7)ランタイム・ルーチン(位置固定)が独立しており、   機種に依存するのは1文字入出力と1行入力の部分だけである。 \\\\\\\\\\\\\\\\\\\  拡張Kコンパイラの使い方          (オンメモリ版) \\\\\\\\\\\\\\\\\\\ コンパイラの作り方 リスト5のダンプ・リストを打ち込み、 ファイル名”RT”でセーブします。 次に、リスト6のダンプ・リストを打ち込み、 ファイル名”K”でセーブします。 FM-11 の方は、リスト7に従い、 ファイル版に変更を参照してください。 コンパイル時には、”RT”と”K”が必要ですが、 実行時には”RT”があれば実行できます。 ソース・プログラムの作り方 拡張K言語のソース・テキスト(プログラム)は F−BASICの REM文の形で作成します。 したがって、1行の文の先頭には必ず『’』がなくてはいけません。 リスト1のプログラム例は、1から10の範囲の乱数を 100個とり、 偶数と奇数のどちらが多いかをみるプログラムです。 行番号はテキスト作成を行なう場合は必要なく、 25行にあるGOTO文のジャンプ先は、 20行に定義されているラベル『GETRAND』です。 また、BASIC では1行に複数のステートメントを記述する場合、 その区切りは『:(コロン)』で行ないますが、 拡張Kでは『;(セミコロン)』を使います。 ですから、25行にある『;』は、 PRINT文 の出力を連続させるためのものではなく、 次の『fI』との区切りを意味します。 拡張KのPRINT文 は指定(改行子『/』を書く)をしないかぎり、 改行は行ないません。 拡張Kでは英字の大小文字は区別しないので(文字列中は除く)、 キーワードを小文字、その他を大文字として、 リストを見やすくすることもできます。 その他、詳しい文法などはここでは省略しますが、 拡張Kを初めて使う方は、 まず次ページのリスト1を入力してみてください。 入力したプログラムは、 通常のBASICと同様にテープにセーブできます。 コンパイル ソース・テキストの入力後、EXEC&H2000[RET] と入力すると、 コンパイルが開始されます。 コンパイル・エラーが生じた場合、 その行と位置を表示するので、ソース・テキストを修正して、 再度コンパイルを行なってください。 コンパイルが正常に終了すると、 オブジェクト・プログラムのサイズが表示されます。 これはオブジェクトをセーブする場合に必要となるので、 値をメモなどに記入しておいてください。 リスト1のプログラムをコンパイルすると、 図1のようになります。         図1 コンパイル画面 ・―――――――――――――――――――――――――――――――――――――・ |Ready | |EXEC&H2000 | | | |K COMPILER VERSION 3.3 | |COPYRIGHT 1982 BY COMPAC. | | | | | | | | | |COMPILING... | | | | | | | | | |OBJECT PROGRAM SIZE :179 ($00B3) | | | |COMPILE END. | |Ready | ・―――――――――――――――――――――――――――――――――――――・ 実 行 コンパイルしたオブジェクトは$5000より生成されるので、 EXEC&H5000[RET] で、すぐに実行することが可能です。 しかし、プログラムの作りによっては暴走する場合もあるので、 実行前にソース・テキストをテープなどにセーブしておいてください。 リスト1のプログラムを実行すると、図2のようになります。 リスト2はリスト1と同様のプログラムを、 BASICで記述したものです。 入力してその実行速度を比較すると、 Kコンパイラ・オブジェクトの実行の速さがわかるでしょう。 完成したオブジェクトは、そのままマシン語プログラムとして、 セーブすることができます。 このとき、ランタイム・ルーチンも合わせてセーブすれば、 再び実行するときに ランタイム・ルーチンを別にロードする必要がなくなります。 セーブするコマンドは通常のマシン語と同様、  ・――――――――――――――――――――――・  |SAVEM"File Name",&H4D00,End Address,&H5000 |  ・――――――――――――――――――――――・ となり、End Address は オブジェクト・プログラムのサイズに&H5000を加えたものです。 File Name は任意に付けてください。 オブジェクトは、 先頭でPSHS、END文 および文の最後でPULSを行なって、 スタック・ポインタおよびレジスタ類を全部保護するので、 他のルーチン(BASIC など)から、サブルーチンとして利用できます。 ■■■■■■■■■■ リスト1 サンプル・プログラム ■■■■■■■■■■■■ ・―――――――――――――――――――――――――――――――――――――・ |10 '(* サンプル プログラム *) KISUU=0; GUUSU=0 | |15 '`for N=1 to 100 | |20 ' GETRAND; RD=rnd(11) | |25 ' if RD=0 then goto GETRAND else print ".";fi | |30 ' if (RD and $0001)=0 then GUUSU=GUUSU+1 | |35 ' else KISUU=KISUU+1 | |40 ' fi | |45 'next | |50 'print /,"キスウ : ", KISUU, " カイ",/,"グウスウ: ", GUUSU, " カイ"/ | |55 'end | ・―――――――――――――――――――――――――――――――――――――・ ■■■■■■■■■■ リスト2 比較プログラム(BASIC)  ■■■■■■■■■■■ ・―――――――――――――――――――――――――――――――――――――・ |10 'サンプル プログラム | |15 RANDOMIZE | |20 FOR N=1 TO 100 | |25 RD%=RND*10 | |30 IF RD%=0 THEN 25 ELSE PRINT "."; | |35 IF (RD% AND &H1)=0 THEN GUUSU=GUUSU+1 ELSE KISUU=KISUU+1 | |40 NEXT | |45 PRINT:PRINT "キスウ : "; KISUU; " カイ": PRINT "グウスウ: "; GUUSU; " カイ" | |50 END | ・―――――――――――――――――――――――――――――――――――――・         図2 実行画面 ・―――――――――――――――――――――――――――――――――――――・ |Ready | |EXEC&H5000 | |..........................................................................| |.................... | |キスウ : 48 カイ | |グウスウ: 52 カイ | | | |Ready | |HARDC | ・―――――――――――――――――――――――――――――――――――――・    図3 Kコンパイラ・メモリ・マップ ・――――――――――――――――――――――・ |     ・―――――――――――――・  | |     |             |  | |     | ソース・プログラム       |  | |     |             |  | |  $2000|―――――――――――――|  | |     |■■■■■■■■■■■■■|  | |     |■コンパイラ本体■■■■■■■|  | |     |■(リロケータブル)■■■■■■■|  | |     |■■■■■■■■■■■■■|  | |  $41FF|―――――――――――――|  | |     |             |  | |  $4300|―――――――――――――|  | |     | コンパイラ・シンボル・テーブル   |  | |  $4B00|―――――――――――――|  | |     | コンパイラ・作業用エリア    |  | |  $4C00|―――――――――――――|  | |     | 実行時のワーク・エリア     |  | |  $4D00|―――――――――――――|  | |     |■ランタイム・ルーチン■■■■■■■|  | |  $5000|―――――――――――――|  | |     |::::::::::::::::::::::::::|  | |     |::オブジェクト::::::::::::::::|  | |     |::(リロケータブル)::::::::::::::|  | |     |::::::::::::::::::::::::::|  | |     ・―――――――――――――・  | ・――――――――――――――――――――――・ ・――――――――――――――――――――――――――――――――・ |■■■文■■■|■■■■■■■■機■■■■■■能■■■■■■■■| |―――――――+――――――――――――――――――――――――| |       |キーボードにより1文字を入力する。       | |       |キー入力がないときは、0を値として持つ。    | | GET   |ランタイム・ルーチンの$4F86を$00から     | |       |$01に変更すると、キー入力があるまで      | |       |待つようになる。                | |―――――――+――――――――――――――――――――――――| |       |キーボードから[RET]キーが押されるまでを   | |       |入力とする。                  | | INPUT |[DEL]キー、[INS]キーで、         | |       |入力した文字の削除、挿入ができる。       | |       |[CTRL]+[C]で実行を中止する。         | |―――――――+――――――――――――――――――――――――| |       |画面に出力する。                | |       |ランタイム・ルーチンの$4F38を$8Dにすると、  | | PRINT |画面とプリンタの両方に出力する。        | |       |プリンタにだけ出力するには、$4F39を$15にする。| ・――――――――――――――――――――――――――――――――・ 裏RAMの使用(FM−7のみ) FM−7では、BASICインタープリタROMと アドレスが重複しているRAMを、 ソフトウェアで切り換えて使うことができます。 このRAMエリアを裏RAMと呼び、 ここヘコンパイラを移動することで、 テキスト・エリア、オブジェクト・エリアを増やすことが可能です。 拡張Kコンパイラを裏RAMに移して使うには、次のようにしてください。 (1)通常の手段で、ランタイム、コンパイラ本体をロードします。 (2)リスト3のリロケータを入力して、EXEC&H2000[RET]でコンパイルします。 (3)EXEC&H5000[RET]でリロケータを実行すると、   スタート、エンド、ディスティネーションの各アドレスの入力要求をしてきます。   たとえば次のように入力してください(アンダーラインの部分を入力する)。   ・―――――――――――――――――――――――――・   |START ADDR=$2000[RET]←Kコンパイラの先頭アドレス   |   |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ |   |END ADDR=$41FF[RET]←Kコンパイラの最終アドレス   |   |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ |   |DEST ADDR=$C000[RET]←Kコンパイラを移す先頭アドレス |   |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ |   ・―――――――――――――――――――――――――・   なお、このリロケータのオブジェクトを、   ランタイム・ルーチンと合わせてセーブし、   裏RAM用リロケータとすれば、次回から(2)の作業は不要になります。 (4)リロケートが済んだら、   リスト4のエグゼキュータのリストを入力し、コンパイルします。 (5)コンパイルが済んだら   エグゼキュータ・オブジェクトは単独でセーブしておきます。 (6)以上でコンパイルの準備は完了なので、   ・―――――――――――――――――――――――――・   |CLEAR100,&H41FF[RET] |   ・―――――――――――――――――――――――――・   と入力してから、コンパイルしたいプログラムをロードしてください。   通常の拡張Kコンパイラに比べ、テキスト・エリアが増えるので、   従来メモリ不足で入力できなかったソース・テキストも   かなり入力することができます。 (7)ソース・テキストの入力が済んだら、万一のことを考えて   テープなどにセーブしてください。   このあと、(5)でセーブしたエグゼキュータをロードし、   ・―――――――――――――――――――――――――・   |EXEC&H5000[RET]                 |   ・―――――――――――――――――――――――――・   で実行します。   すると、コンパイラのスタート・アドレスを聞いてくるので、   ・―――――――――――――――――――――――――・   |EXEC ADDR=$C000[RET] |   ・―――――――――――――――――――――――――・   (これは(3)の『DEST ADDR』 で入力した値)と入力すれば、   裏RAMにリロケートしたコンパイラが起動します。   コンパイラを起動する前には必ずエグゼキュータをロードしてください。 \\\\\\\\\\\\\\\\\\\  ファイル版への変更(FM7/11) \\\\\\\\\\\\\\\\\\\ 通常の拡張Kコンパイラは、メモリ上にあるソース・テキストを コンパイルしますが(これを便宜上オン・メモリ版と呼びます)、 テキスト・エリアが約6Kとバイト限られているため、 長いプログラムのコンパイルはできません。 これに対し、ファイル版の拡張Kコンパイラは、 ディスクあるいはテープに ASCII形式でセーブしたソース・プログラムを コンパイルするので、オブジェクト・エリアの許す限りのソースを コンパイルすることができます。 オン・メモリ版をファイル版に変更するには、 コンパイラ本体とランタイム・ルーチンを、 リスト7のダンプ・リストに従って変更し、 リスト8のメイン・プログラムを入力してください。 入力後、次のようにしてディスクまたはテープにセーブします.  ・―――――――――――――――――――――――――・  |SAVE"MAIN"[RET] |  |SAVEM"RTF",&H4D00,&H4FFF,&H4D00[RET] |  |SAVEM"KF",&H2000,&H41FF,&H2000[RET] |  ・―――――――――――――――――――――――――・ FM−11では$4FACからの2バイトを、$E537に変更してください。 これは、F−BASIC ROMの1行入力ルーチンのアドレスです。 F−BASICのバージョンによって、変わることがあるので注意してください。 また、$4FA1を$2Cに、$4FE2を$39に変更してください。 変更したファイル版は次の順序で使います。 (1)ソース・テキストを入力し、   それを使っている外部記憶装置(ディスクまたはテープ)に   ASCII形式 でセーブします。 (2)リスト8のメイン・プログラムをロードしRUNします。   すると、“HOT OR COLD?”とメッセージがでるので、   ランタイムおよびコンパイラがメモリ上にロード済みであれば[H]を、   そうでなければ、変更したランタイムとコンパイラを   セーブしたディスク(ドライブ0)またはテープをセットしてから、   [C]をキーインしてください。 (3)次に、“FILE NAME?”とメッセージがでるので、   (1)でセーブしたソース・テキストのファイルをセットしてから   ファイル名を入力します。 (4)ファイル名を入力すると、   ソース・テキストをファイルから読みながらコンパイルを始め、   できあがったオブジェクトはメモリ版同様に実行、セーブが可能です。 \\\\\\\\\\\\\\\\\\\      バージョン・アップ \\\\\\\\\\\\\\\\\\\ V3.6では、旧バージョンに次の変更、デバッグをしたので、 旧デバージョンをお持ちの方は、リスト9に従って変更してください。 (1)コンパイル・エラーのとき、暴走することがあった。   対策:    コンパイルの最初でSスタックを保存し、    最後でSスタックを復帰した後、BASIC に戻るようにした。    コンパイラをサブルーチンとして使う方は、    $41F7を$7Fから$FFに変えれば、    レジスタ類が全部保護されて戻ってくるようになる。    これに伴ない、旧バージョンの$2001は$2003に、    $2005は$2007に変わっている。 (2)オブジェクト・プログラムが、サブルーチンとならない。   対策:    オブジェクト・プログラムの先頭で、PSHSを行ない、    Sスタックを保存し、    END文 およびオブジェクト・プログラムの最後で、    Sスタックを復帰(PULS)して戻るようにした。    これによって、オブジェクト・プログラム内で、    たとえSスタックを変更しても、正常に復帰できる。    注)以前のように、強制的にBASIC に戻すことはしないので、      プログラムでRAMモードにしたときは、      最後に必ずROMモードに戻す。 (3)論理演算子 ANDを英小文字で使うと、論理和 ORとなった。   また、配列を用いて ANDを3個以上続けると、   論理和 ORとなった。   対策:修正。 (4)PEEK文で変数を使うと、2バイトPEEKになった。   対策:修正。 (5)POKE文、CPOKE文 の中で、PEEK文が動作しなかった。   対策:修正。 (6)ラベル・テーブルが小さかった。   対策:ラベル・テーブルを$100 ふやした。     表1 Kコンパイラ エントリ・マップ(V3.3) ・――――――――――――――――――――――――――――――――・ |アドレス| 内容 |       機      能       | |――――+――――+――――――――――――――――――――――| |2003 | 4C |コンパイル時変数エリア・アドレスの上位1バイト。 | |2007,8 | 4C00 |コンパイル時Uスタック・エリアの最終アドレス。 | |2073,4 | 4200 |プログラム1行入力バッファ・アドレス。 | |207D,E | 5000 |オブジェクト作成アドレス。 | |2082,3 | 4300 |シンボル・テーブル・アドレス。  | |208E,F | 4B8E |コンパイル時スタック・エリアの最終アドレス。 | |209A,B | 4B00 |コンパイル時作業用エリア。 | |20C0 | 4C |実行時変数エリア・アドレスの上位1バイト。 | |20CE | 4C |実行時Uスタック・エリア最終アドレスの上位1バイト。 | |20D4 | 00 |実行時Uスタック・エリア最終アドレスの下位1バイト。 | |4186 |サブルーチン |コンパイラ1行入力ルーチン。 | |41E2 | 〃 |コンパイラOPENルーチン。 | |41EE | 〃 |コンパイラCLOSEルーチン。 | |4D00 | 〃 |ランタイム1文字入力ルーチン。 エコーバックなし。 | |4D03 | 〃 |ランタイム1文字出力ルーチン。 | |4D06 | 〃 |ランタイム1行入力ルーチン。 エコーバックあり。 | | |    |バック・スペースあり。 | ・――――――――――――――――――――――――――――――――・ \\\\\\\\\\\\\\\\\\\        注意・その他 \\\\\\\\\\\\\\\\\\\ 配列の使い方 拡張K言語での配列は、1バイト配列と2バイト配列があり、 その領域は、実アドレスで指定します。 配列を使うには、そのデータをメモリ上のどこに配置するかを、 ユーザー自身で決定し、その先頭アドレスを、 ・――――――――――――――――――――――・ |  変数名=式(式は配列の先頭アドレス)  | ・――――――――――――――――――――――・ で指定します。ここで使った変数名が、以後配列名として使われます。 配列要素のアクセスは下記のように行ないますが、 要素数の上限を考慮して、 配列エリアにはプログラムが書かれないようにし、 また配列エリアを超えて書き込みが行なわわれないように、 注意が必要です。 配列は変数の値を変えることで、 その位置を簡単に変更することができるので、 プログラム中で配列を動的に処理することも可能です。 ・―――――――――――――――――――――――――――――――――――――・ | [1バイトのアクセス]  [2バイトのアクセス] | | 書式) 変数:式) 書式) 変数:式) | | | | 変数の値(先に先頭アドレス を定義)に 変数の値(先に先頭アドレス を定義)に | | 式の値を加えたアドレス をアクセスします。 (式*2)の値を加えたアドレスを | | アクセスします。 | | | | 例)DIMA=$6000 例)DIMB=$6100 | |   X=DIMA:3) Y=DIMB:3) | || | | | | ||―| |―| | ||15|6000 ←DIMA | |$6100 ←DIMB | ||―| |―| | ||FF| | | | ||―| |―| | ||FF| |00| | ||―| |―|$6100+2*1←DIMB | ||A7| |0F| | ||―| |―| | ||02|$6000+3←DIMA:3) | | | ||―| | || | | |メモリ内容が上図のようであれば、 メモリ内容が上図のようであれば、 | |Xには$02が代入されます。      Yに は$000Fが代入されます。 | ・―――――――――――――――――――――――――――――――――――――・ サブルーチン・関数・手続の使い方 拡張K言語では、サブルーチン・関数・手続の区別がなく、 RETURN文で終了しているルーチンは、そのいずれとしても使用が可能です。 もし、サブルーチンとして使っているのであれば、 呼び出しはGOSUB文 で行ないます。 これを関数・手続として使った場合、 呼び出しは単にラベル名に[ ]で囲んで引数列を書きます。 関数として使用するとき呼び出されたルーチンで、 最後に実行された代入の値をラベル名に持ち帰ります。 たとえば、階乗を値とする閔数FACTは次のような記述が可能です。 ・――――――――――――――――――――――・ | 10 'FACT:                 | | 20 ' IF %1=1 THEN A=1           | | 30 ' ELSE A=%1*FACT[%1-1]     | | 40 'FI                   | | 50 'RETURN                 | ・――――――――――――――――――――――・ 上の例でFACT関数はAに代入された値をFACTの値として持ち帰るので、 引数を1としてFACTを呼ぶとFACTの値が1となります。 また、この例ではFACTの中で再びFACTを呼び出す、 リカーシブコールも行なっています。 ただし、このような処理をさせる場合、 スタックオーバーフローする危険があるので、 充分な注意が必要です。 サブルーチン・関数・手続をコールした場合の引数は、 スタックにその値がセットされる値渡しで、 サブプログラム側に渡されます。 ただし、文字列はその格納されているアドレスが、 スタックにセットされるので、 サブプログラム側ではそのアドレスからPEEK関数などで、 文字列を読み出すことになります。 なお、文字列の終わりは1バイトの0がセットされており、 それ以後のプログラムと区別することができます。 サブプログラム側で引数を参照する場合は%変数を使いますが、 これは前記のように、スタックの値を参照するため、 コール側の引数を変化させることはできません。 サブ側でコール側の引数を変化させたい場合、 ADR関数 でその変数のアドレスを渡し、 PEEK、POKEなどでその内容を変更することになります。 サブルーチンがコールされた時点での スタックと、引数、%変数の対応は 次のようになります。 ・――――――――――――――――――――――――――――――――・ |   [例]ALPHA[2,A,”ABC”] | |            | |   | | |     ・――――――・ |   | | |   ・―+――――――――・   | | | ・―+―+――――――――――――・ | | | | |   |     |↑Lowアドレス | | | | |   |―――――| | | | | | SP→| Ret Adr |%0…リターン・アドレス | | | | |   |―――――| | | | | ・――→|第1引数 |%1…$0002 | | | |     |―――――| | | | ・――――→|第2引数 |%2…変数Aの値 | | |       |―――――| | | ・――――――→|第3引数 |%3…文字列の格納され |  | | |    Hiアドレス ↓|―――――|  ているアドレス を |――| | |         |     |  指す。  ―――→|$41| | |                           |――| | |                         |$42| | |                           |――| | |                           |$43| | |                           |――| | |                           |$00| | |                           |――| | |                           | | | | | ・――――――――――――――――――――――――――――――――・ 外部ルーチンとのリンク ユーザーがアセンブラなどで記述した手続や、 システムのユーティリティ・ルーチンをコールするには、 DEF文 でその開始アドレスを定義し、 呼び出しは一般のサブルーチンや関数と同様に行ないます。 引数も同様にシステム・スタックに値がセットされて (サブルーチン・関数の使い方参照)渡されます。 ユーザールーチンからの値は、AccDにセットすれば、 リターン後その値が外部関数の値となります。 このときS、Uスタック、DPRは変更してはいけません。 Kコンパイラ・キーワード キーワードはすべて予約語で、 その意味はKコンパイラの仕様で定めています。 キーワードの区切りは、空白または記号で、 変数名をキーワードで始めた場合の動作は保障しません。  ABS、ADR、AND : INPUT  CALL、CHR$、CODE : NEXT  CONST、CPOKE : NOT  DEF : OR  ELSE、END : PEEK、POKE、PRINT  FI、FOR : REPEAT、RETURN、RND  LOW : SEX、SGN、SPC$  HEX$、HEX$2、HIGH : UNTILL  IF : WHILE、WEND  GET、GOSUB、GOTO : エラーメッセージ 拡張Kコンパイラはコンパイル時の構文チェックを完全に行なわないので、 プログラミングの際は次の点に充分注意してください。 (1)変数の誤りや、予約語との重複に注意する。 (2)サブルーチン・関数などの呼び出しでのパラメータの過不足。 (3)CODE文、CALL文の数値やアドレスの誤り。 コンパイル時のエラーメッセージとその意味を表2に示します。         表2 エラーメッセージ ・――――――――――――――――――――――――――――――――・ |DOUBLE DEF ERROR |ラベルの二重定義がある。         | |ELSE WITHOUT IF |ELSEに対応するIFがない。         | |FI WITHOUT IF |FIに対応するIFがない。          | |ILLEGAL ARGUMENT |手続、関数のパラメータに誤りがある。   | |ILLEGAL EXPRESSION |許されない式である。           | |ILLEGAL NESTING |REPEAT、WHILE、FOR、IF句の対応がおかしい。| |NEXT WITHOUT FOR |NEXTに対応するFOR がない。        | |SYNTAX ERROR |構文に誤りがある。            | |TOO MANY VALIABLES |変数の数が多すぎる。           | |UNDEFINED LABELS |未定義のラベルである。          | |UNTIL WITHOUT REPEAT|UNTIL に対応するREPEATがない。      | |WEND WITHOUT WHILE |WENDに対応するWHILE がない。       | ・――――――――――――――――――――――――――――――――・ \\\\\\\\\\\\\\\\\\\       最後に \\\\\\\\\\\\\\\\\\\ 紙面に限りがあり、できませんでした。 実際の使用例が、いろいろ載っているので、 他のKコンパイラの記事を参考にしてください。